@echo off
chcp 65001 >nul
echo 功能：将所有文件夹下的文件移动到 Result 目录下，以文件名前缀（下划线_前）为名称的文件夹中

setlocal EnableDelayedExpansion

:: 等待用户按键
set /p dummy=按 Enter 键开始：

:: 记录开始时间（秒）
for /f "tokens=1-4 delims=:.," %%a in ("%TIME%") do (
    set /a start_seconds=%%a*3600 + %%b*60 + %%c
    set start_milliseconds=%%d
)

:: 初始化文件计数
set /a file_count=0

:: 创建 Result 目录（如果不存在）
set "result_dir=%~dp0Result"
if not exist "%result_dir%" mkdir "%result_dir%"

:: 遍历当前目录下的所有文件夹（排除 Result 文件夹）
for /d %%D in (*) do (
    if /I not "%%D"=="Result" (
        echo 正在处理文件夹：%%D

        :: 遍历当前文件夹的所有文件
        for %%F in ("%%D\*") do (
            set "filename=%%~nxF"
            set "tmp=!filename:_=!"

            :: 判断文件名是否包含下划线
            if not "!tmp!"=="!filename!" (
                for /f "tokens=1 delims=_" %%A in ("!filename!") do (
                    set "prefix=%%A"
                    set "dest_dir=%result_dir%\!prefix!"

                    :: 创建目标目录（如果不存在）
                    if not exist "!dest_dir!" mkdir "!dest_dir!"

                    :: 移动文件
                    move "%%F" "!dest_dir!\" >nul

                    :: 更新计数
                    set /a file_count+=1
                )
            )
        )
    )
)

:: 记录结束时间（秒）
for /f "tokens=1-4 delims=:.," %%a in ("%TIME%") do (
    set /a end_seconds=%%a*3600 + %%b*60 + %%c
    set end_milliseconds=%%d
)

:: 计算耗时（秒）
set /a elapsed_seconds=end_seconds - start_seconds
:: 防止跨午夜导致负值
if %elapsed_seconds% lss 0 set /a elapsed_seconds+=86400

:: 输出结果
echo 处理完成，总计处理文件数：%file_count%（耗时 %elapsed_seconds% 秒）
set /p dummy=按 Enter 键关闭：
exit